'use strict';

module.exports = (option, app) => {
  return async (ctx, next) => {

    ctx.logger.debug('请求参数：', ctx.request.body);

    const authorization = ctx.header.authorization;

    if (!authorization) {
      ctx.response.tokenError(401);
      return;
    }
    const tokens = authorization.split(' ');
    try {
      if (!(/^Bearer$/i.test(tokens[0]))) {
        return;
      }
      const tokenInfo = await app.checkToken(tokens[1]);
      if (!tokenInfo) {
        ctx.response.tokenError(403);
        return;
      }
      const macAddrFlag = await ctx.getAllMacAddr();
      //验证mac地址
      const macAddr = ctx.headers && ctx.headers.macaddr || '';
      if (!macAddr || !macAddrFlag.includes(macAddr) || !macAddrFlag.includes(tokenInfo.macAddr)) {
        ctx.response.failByCode('0007', 403);
        return;
      }
      // console.log('解析后的token信息：', tokenInfo);
      // 将当前用户信息存入 ctx 对象中，方便controller、service取到。
      ctx.curAdminUser = tokenInfo; 

    } catch (error) {
      // 返回token错误信息
      switch (error.name) {
        case 'JsonWebTokenError':
          ctx.response.tokenError(403);
          return;
        case 'TokenExpiredError':
          ctx.response.tokenError(403);
          return;
        default:
          ctx.response.tokenError(401);
          return;
      }
    }
    // 进入下一个中间件
    await next();
  };
};
